/****************************************************************

DESCRIPTION: This file contains a library of validation functions
  using javascript regular expressions.  Library also contains 
  functions that reformat fields for display or for storage.


  VALIDATION FUNCTIONS:

  - Email : checks format of email address
    REMARKS: Accounts for email with country appended
    does not validate that email contains valid URL
    type (.com, .gov, etc.) or valid country suffix.

  - USPhone : checks format of US phone number
    Ex. (999) 999-9999 or (999)999-9999
    
  - Numeric : checks for valid numeric value
  
  - Integer : checks for valid integer value
  
  - NotEmpty : checks for blank form field
  
  - USZip : checks for valid US zip code
    Ex : 99999 or 99999-9999
  
  - USDate : checks for valid date in US format

  FORMAT FUNCTIONS:

  rightTrim - removes trailing spaces from a string
  leftTrim - removes leading spaces from a string
  trimAll - removes leading and trailing spaces from a string
  removeCurrency - removes currency formatting characters (), $
  addCurrency - inserts currency formatting characters
  removeCommas - removes comma separators from a number
  addCommas - adds comma separators to a number
  removeCharacters - removes characters from a string that match 
  passed pattern

*******************************************************************/

jQuery.fn.validateFormat = function(attributes)
{
  this.each(function() {
    var formatsToValidate = $(this).attr("validate").toUpperCase().split(" ");
    var objRegExp;
    var testRes = true;
    for (formatToValidate in formatsToValidate)
    {
      switch (formatToValidate)
      {
        case "EMAIL"
          objRegExp  = /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
          testRes = objRegExp.test(this.val());
          break;
        case "USPHONE"
          objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
          testRes = objRegExp.test(this.val());
          break;
        case "NUMERIC"
          objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
          testRes = objRegExp.test(this.val());
          break;
        case "INTEGER"
          objRegExp  = /(^-?\d\d*$)/;
          testRes = objRegExp.test(this.val());
          break;
        case "NOTEMPTY"
          testRes = (strTemp.length > 0);
          break;
        case "USZIP"
          objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
          break;
        case "USDATE"
          //check to see if in correct format
          if(!objRegExp.test(strValue))
          {
              testRes = false; //doesn't match pattern, bad date
              break;
          }
          else
          {
              var strSeparator = strValue.substring(2,3) 
              var arrayDate = strValue.split(strSeparator); 
              //create a lookup for months not equal to Feb.
              var arrayLookup = { '01' : 31,'03' : 31, 
                                  '04' : 30,'05' : 31,
                                  '06' : 30,'07' : 31,
                                  '08' : 31,'09' : 30,
                                  '10' : 31,'11' : 30,'12' : 31}
              var intDay = parseInt(arrayDate[1],10); 

              //check if month value and day value agree
              if(arrayLookup[arrayDate[0]] != null) {
                if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
                  testRes = true; //found in lookup table, good date
                  break;
              }
              
              //check for February (bugfix 20050322)
              //bugfix  for parseInt kevin
              //bugfix  biss year  O.Jp Voutat
              var intMonth = parseInt(arrayDate[0],10);
              if (intMonth == 2) { 
                 var intYear = parseInt(arrayDate[2]);
                 if (intDay > 0 && intDay < 29) {
                     testRes = true;
                 }
                 else if (intDay == 29) {
                   if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
                       (intYear % 400 == 0)) {
                        // year div by 4 and ((not div by 100) or div by 400) ->ok
                       testRes = true;
                       break;
                   }   
                 }
              }
            }  
          testRes = false; //any other values, bad date      
          break;      
       }
     }
  });

}



function rightTrim( strValue ) {
/************************************************
DESCRIPTION: Trims trailing whitespace chars.

PARAMETERS:
   strValue - String to be trimmed.

RETURNS:
   Source string with right whitespaces removed.
*************************************************/
var objRegExp = /^([\w\W]*)(\b\s*)$/;

      if(objRegExp.test(strValue)) {
       //remove trailing a whitespace characters
       strValue = strValue.replace(objRegExp, '$1');
    }
  return strValue;
}

function leftTrim( strValue ) {
/************************************************
DESCRIPTION: Trims leading whitespace chars.

PARAMETERS:
   strValue - String to be trimmed

RETURNS:
   Source string with left whitespaces removed.
*************************************************/
var objRegExp = /^(\s*)(\b[\w\W]*)$/;

      if(objRegExp.test(strValue)) {
       //remove leading a whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function trimAll( strValue ) {
/************************************************
DESCRIPTION: Removes leading and trailing spaces.

PARAMETERS: Source string from which spaces will
  be removed;

RETURNS: Source string with whitespaces removed.
*************************************************/
 var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }

   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function removeCurrency( strValue ) {
/************************************************
DESCRIPTION: Removes currency formatting from
  source string.

PARAMETERS:
  strValue - Source string from which currency formatting
     will be removed;

RETURNS: Source string with commas removed.
*************************************************/
  var objRegExp = /\(/;
  var strMinus = '';

  //check if negative
  if(objRegExp.test(strValue)){
    strMinus = '-';
  }

  objRegExp = /\)|\(|[,]/g;
  strValue = strValue.replace(objRegExp,'');
  if(strValue.indexOf('$') >= 0){
    strValue = strValue.substring(1, strValue.length);
  }
  return strMinus + strValue;
}

function addCurrency( strValue ) {
/************************************************
DESCRIPTION: Formats a number as currency.

PARAMETERS:
  strValue - Source string to be formatted

REMARKS: Assumes number passed is a valid
  numeric value in the rounded to 2 decimal
  places.  If not, returns original value.
*************************************************/
  var objRegExp = /-?[0-9]+\.[0-9]{2}$/;

    if( objRegExp.test(strValue)) {
      objRegExp.compile('^-');
      strValue = addCommas(strValue);
      if (objRegExp.test(strValue)){
        strValue = '(' + strValue.replace(objRegExp,'') + ')';
      }
      return '$' + strValue;
    }
    else
      return strValue;
}

function removeCommas( strValue ) {
/************************************************
DESCRIPTION: Removes commas from source string.

PARAMETERS:
  strValue - Source string from which commas will
    be removed;

RETURNS: Source string with commas removed.
*************************************************/
  var objRegExp = /,/g; //search for commas globally

  //replace all matches with empty strings
  return strValue.replace(objRegExp,'');
}

function addCommas( strValue ) {
/************************************************
DESCRIPTION: Inserts commas into numeric string.

PARAMETERS:
  strValue - source string containing commas.

RETURNS: String modified with comma grouping if
  source was all numeric, otherwise source is
  returned.

REMARKS: Used with integers or numbers with
  2 or less decimal places.
*************************************************/
  var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})');

    //check for match to search criteria
    while(objRegExp.test(strValue)) {
       //replace original string with first group match,
       //a comma, then second group match
       strValue = strValue.replace(objRegExp, '$1,$2');
    }
  return strValue;
}

function removeCharacters( strValue, strMatchPattern ) {
/************************************************
DESCRIPTION: Removes characters from a source string
  based upon matches of the supplied pattern.

PARAMETERS:
  strValue - source string containing number.

RETURNS: String modified with characters
  matching search pattern removed

USAGE:  strNoSpaces = removeCharacters( ' sfdf  dfd',
                                '\s*')
*************************************************/
 var objRegExp =  new RegExp( strMatchPattern, 'gi' );

 //replace passed pattern matches with blanks
  return strValue.replace(objRegExp,'');
}